# 假设你是某大学招生主管，你想根据两次考试的结果决定每个申请者的录取机会。
# 现有以往申请者的历史数据，可以此作为训练集建立逻辑回归模型，并用其预测某学生能否被大学录取。请按要求完成实验
#
# 数据集
#
# 文件 ex2data1.txt 为该实验的数据集，第一列、第二列分别表示申请者两次考试的成绩，第三列表示录取结果（1 表示录取，0 表示不录取）。
#
# 步骤与要求
#
# 1）某学生两次考试成绩分别为 42、85，预测其是否被录取，并求被录取的概率；
#
# 2）请描述什么是ROC、AUC，并说明其用途；
#
# 3）请将原始数据分为训练集80%和测试集20%,请20%测试考生是否被录取进行预测，输出预测准确率，并画出ROC曲线。

from numpy import *
import matplotlib.ticker as ticker
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
'''
数据预处理：
'''
def init_data():
    data = []
    label =[]
    train_data =open('./data/ex2data1.txt')
    lines = train_data.readlines()
    for line in lines:
        scores =line.split(",")
        isQualified =scores[2].replace("\n","")
        data.append([float(scores[0]),float(scores[1])])
        label.append(int(isQualified))
    return  np.array(data),np.array(label).transpose()

'''
主函数
'''

if __name__=='__main__':
    x_train,y_train=init_data()

    reg =LogisticRegression()
    reg.fit(x_train,y_train)
    yc=[[42,85]]
    x_test=np.array(yc)
    y_test=reg.predict(x_test)
    result = reg.predict_proba(x_test)

    print('录取的概率：',result[0][1])
    if y_test==1:
        print('经过预测，该生可能被录取')
    else:
        print('经过预测，该生不可能被录取')

    #第三个问题
    #分割数据
    x_train,x_test,y_train,y_test =train_test_split(x_train,y_train,random_state=22,test_size=0.2)
    #特征预处理
    transfer = StandardScaler()
    x_train =transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)

    #逻辑回归
    estimator =LogisticRegression()
    estimator.fit(x_train,y_train)
    y_predict=estimator.predict(x_test)

    #模型评估
    print("准确率：",estimator.score(x_test,y_test))
    print("预测率：\n",y_predict)

    #绘制ROC曲线
    y1_valid_score_lr1=estimator.predict_proba(x_test)
    print(y1_valid_score_lr1)
    print("AUC指标：",metrics.roc_auc_score(y_test,y1_valid_score_lr1[:,1]))
    fpr,tpr,thresholds =metrics.roc_curve(y_test,y1_valid_score_lr1[:,1])
    roc_auc=metrics.auc(fpr,tpr)
    print(fpr,tpr)

    plt.plot(fpr,tpr,lw=2,alpha=.6)
    plt.plot([0,1],[0,1],lw=2,linestyle="--")
    plt.xlim([0,1])
    plt.ylim([0,1.05])
    plt.xlabel("FPR")
    plt.ylabel("TPR")
    plt.title("ROC cure")
    plt.legend(["Logistic Reg 1 (AUC {:.4f})".format(roc_auc)],fontsize=8,loc=2)
    plt.show()





